package xfuzzy.alg_genetico.indeterminado.cross;

import xfuzzy.xfghl.codification.DoubleChromosome;
import xfuzzy.xfghl.codification.EncodingSymbols;

public class CruceOrden implements EncodingSymbols {
	
	public CruceOrden(long seed)  {
		
		//super(seed);
	}
	
	// La mutacion en la estructura podria ser un intercambio de un '+' por un '-'. Podria dar lugar a un cromosoma no valido en su
	// estructura, con lo que podria suceder que una mutacion que se realizara, al arreglar el cromosoma diera como resultado el 
	// mismo cromosoma.
	
	public DoubleChromosome cruzar(DoubleChromosome c1, DoubleChromosome c2) {

		DoubleChromosome hijo = new DoubleChromosome(c1.getNumVariables());
		//System.out.println("Cruce de variables");
		//this.cruzarVariables(c1, c2, hijo);
		//System.out.println("Cruce de estructuras");
		//hijo = cruzarEstructura(c1, c2, hijo);
		return hijo;
	}
	
//	public static void cruzarVariablesOrden(DobleCromosomaBackward c1, DobleCromosomaBackward c2, DobleCromosomaBackward hijo)  {
//		
//		int [] variables_c1 = c1.getVariables();
//		int [] variables_c2 = c2.getVariables();
//		int [] variables_hijo = new int[c1.getNumVariables()];
//		Random rnd = new Random(UUID.randomUUID().hashCode());
//		for (int i = 0; i < variables_hijo.length; i++)
//			 variables_hijo[i] = -1;
//		int indice1 = rnd.nextInt(c1.getNumVariables());
//		int indice2 = rnd.nextInt(c1.getNumVariables());
//		while (indice1 == indice2)
//			indice2 = rnd.nextInt(c1.getNumVariables());
//		
//		int indice_superior = 0, indice_inferior = 0;
//		if (indice1 > indice2)  {
//			indice_superior = indice1;
//			indice_inferior = indice2;
//		}
//		else  {
//			indice_superior = indice2;
//			indice_inferior = indice1;
//		}
//		
//		int indice_insercion = 0;
//		for (int indice_cruce = indice_inferior; indice_cruce <= indice_superior; indice_cruce++)  {
//				 variables_hijo[indice_cruce] = variables_c1[indice_cruce];
//		}
//		indice_insercion = (indice_superior + 1) % c1.getNumVariables();
//		
//		int valor = -1;
//		for (int indice_cruce = 0; indice_cruce < variables_c2.length; indice_cruce++)  {
//			 valor = variables_c2[indice_cruce];
//			 if (ArrayUtilities.pertenece(variables_hijo, valor) == false)  {
//				 variables_hijo[indice_insercion] = valor;
//				 indice_insercion = (indice_insercion + 1) % c2.getNumVariables();
//			 }
//		}
//		
//		hijo.setVariables(variables_hijo);
//		
//		System.out.println("Indice 1 = " + indice1);
//		System.out.println("Indice 2 = " + indice2);
//		System.out.print("Variables c1 =   ");
//		for (int i = 0; i < variables_c1.length; i++)
//			 System.out.print(variables_c1[i]);
//		System.out.println();
//		System.out.print("Variables c2 =   ");
//		for (int i = 0; i < variables_c2.length; i++)
//			 System.out.print(variables_c2[i]);
//		System.out.println();
//		System.out.print("Variables hijo = ");
//		for (int i = 0; i < variables_hijo.length; i++)
//			 System.out.print(variables_hijo[i]);
//		System.out.println();
//	}
	
	// Este metodo cruza las estructuras de c1 y de c2 de la siguiente forma:
	// Elige dos indices aleatorios (indice1 e indice2) y copia los valores del intervalo que forman los indices desde c1 hacia el 
	// cromosoma hijo; el resto de posiciones se copian desde el cromosoma c2. Se controla que el numero de modulos (-) y el numero
	// de variables sean valor adecuados (en el caso de 6 entradas serian 6 variables y 5 modulos)
	
	public static void cruzarEstructuraConControl(DoubleChromosome c1, DoubleChromosome c2, DoubleChromosome hijo)  {
		
		
	}

//	protected DoubleChromosome cruzarEstructura(DoubleChromosome padre1, DoubleChromosome padre2, DoubleChromosome hijo) {
//		
//		int longitud_estructura = padre1.getNumVariables() + padre2.getNumModulos();
//		char [] estructura_p1 = padre1.getEstructura();
//		char [] estructura_p2 = padre2.getEstructura();
//		char [] estructura_hijo = new char[longitud_estructura];
//		int modulos = 0, variables = 0;
//		int indice1 = this.random.nextInt(longitud_estructura);
//		int indice2 = this.random.nextInt(longitud_estructura);
//		while (indice1 == indice2)
//			indice2 = this.random.nextInt(longitud_estructura);
//		
//		int indice_superior = 0, indice_inferior = 0;
//		if (indice1 > indice2)  {
//			indice_superior = indice1;
//			indice_inferior = indice2;
//		}
//		else  {
//			indice_superior = indice2;
//			indice_inferior = indice1;
//		}
//		
//		// Copia el intervalo [indice1, indice2] desde el cromosoma c1 al cromosoma hijo
//		for (int indice_cruce = indice_inferior; indice_cruce <= indice_superior; indice_cruce++)  {
//			 if (estructura_p1[indice_cruce] == signoModulo) 
//				 modulos++;
//			 if (estructura_p1[indice_cruce] == signoVariable)
//				 variables++;
//			estructura_hijo[indice_cruce] = estructura_p1[indice_cruce];
//		}
//		
//		// Copia el resto del cromosoma hijo desde el cromosoma c2 comprobando que el indice del bucle for no este en el 
//		// intervalo [indice1, indice2] y que no se supere el numero de modulos ni de variables
//		for (int indice = 0; indice < longitud_estructura; indice++)  {
//			 // se comprueba que no este en el intervalo [indice1, indice2]
//			 if ((indice < indice_inferior) || (indice > indice_superior))  {
//				 if (estructura_p2[indice] == signoModulo)  {
//					 if (modulos < padre2.getNumModulos())  {
//						 modulos++;
//						 estructura_hijo[indice] = estructura_p2[indice];
//					 }
//					 else  {
//						 variables++;
//						 estructura_hijo[indice] = signoVariable;
//					 }
//				 }
//				 if (estructura_p2[indice] == signoVariable)  {
//					 if (variables < padre2.getNumVariables())  {
//						 variables++;
//						 estructura_hijo[indice] = estructura_p2[indice];
//					 }
//					 else  {
//						 modulos++;
//						 estructura_hijo[indice] = signoModulo;
//					 }
//				 }
//			 }
//		}
//		
//		hijo.setEstructura(estructura_hijo);
//		
//		System.out.println("Indice 1 = " + indice1);
//		System.out.println("Indice 2 = " + indice2);
//		System.out.print("Estructura p1 =   ");
//		for (int i = 0; i < estructura_p1.length; i++)
//			 System.out.print(estructura_p1[i]);
//		System.out.println();
//		System.out.print("Estructura p2 =   ");
//		for (int i = 0; i < estructura_p2.length; i++)
//			 System.out.print(estructura_p2[i]);
//		System.out.println();
//		System.out.print("Estructura hijo = ");
//		for (int i = 0; i < estructura_hijo.length; i++)
//			 System.out.print(estructura_hijo[i]);
//		System.out.println();
//		return hijo;
//	}
	
}
